package co.edu.udea.herbario.dao.impl;

import co.edu.udea.herbario.dao.Conexion;
import co.edu.udea.herbario.dao.EspecieDao;
import co.edu.udea.herbario.dto.Especie;
import co.edu.udea.herbario.dto.Familia;
import co.edu.udea.herbario.dto.Genero;
import co.edu.udea.herbario.exception.OrgSistemasDaoException;
import co.edu.udea.herbario.util.ConstantesStatic;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ResourceBundle;

/**
 *Esta clase contiene la implementacion de los metodos planteados en la interface EspecieDao,
 * los cuales son utilizados para gestionar los datos de persistencia asociados a las especies 
 * registradas en el sistema
 *
 * @author Lorena Orozco
 */
public class EspecieDaoImp implements EspecieDao
{
    ResourceBundle consultasSQL;    //variable para obtener las consultas sql
    Connection con = null;          //variable para la conexion a la BD
    CallableStatement cs = null;    //variable para el llamado a las funciones de la BD
    ResultSet rs = null;            //variable para obtener el resultado de la consulta sql

    public EspecieDaoImp()
    {
        consultasSQL = ResourceBundle.getBundle(ConstantesStatic.PROPERTIES_CONSULTAS);
        con = Conexion.obtenerInstancia().abrirConexion();
    }

    public Especie obtenerEspecie(int codigo)
    {
        Especie espe = new Especie();       

        try
        {
            String consulta = consultasSQL.getString("obtenerEspecie");
            boolean retorno = false;
           
            cs = con.prepareCall(consulta);

            if(codigo > 0)
            {
                cs.setInt(1, codigo);
            }
            else
            {
                return espe;
            }
            
            retorno = cs.execute();

            if(retorno == true)
            {
                rs = cs.getResultSet();

                while(rs.next())
                {
                    Familia fami = new Familia();
                    fami.setCodigo(rs.getInt("codigofamilia"));
                    fami.setNombre(rs.getString("nombrefamilia"));
                    fami.setFechaIngreso(rs.getDate("fechaingresofamilia"));

                    Genero gen = new Genero();
                    gen.setCodigo(rs.getInt("codigogenero"));
                    gen.setNombre(rs.getString("nombregenero"));
                    gen.setFechaIngreso(rs.getDate("fechaingresogenero"));
                    gen.setFamilia(fami);

                    espe.setCodigo(rs.getInt("codigoespecie"));
                    espe.setNombre(rs.getString("nombreespecie"));
                    espe.setFechaIngreso(rs.getDate("fechaingresoespecie"));
                    espe.setGenero(gen);
                }
            }          

            rs.close();
            cs.close();
        }
        catch (SQLException e)
        {
            new OrgSistemasDaoException(e.getMessage());
        }

        return espe;
    }

    public Especie obtenerEspeciePorNombre(String nom) 
    {
        Especie espe = new Especie();

        try
        {
            String consulta = consultasSQL.getString("obtenerEspeciePorNombre");
            boolean retorno = false;

            cs = con.prepareCall(consulta);

            if(nom != null && !"".equals(nom))
            {
                cs.setString(1, nom);
            }
            else
            {
                return espe;
            }
            
            retorno = cs.execute();

            if(retorno == true)
            {
                rs = cs.getResultSet();

                while(rs.next())
                {
                    Familia fami = new Familia();
                    fami.setCodigo(rs.getInt("codigofamilia"));
                    fami.setNombre(rs.getString("nombrefamilia"));
                    fami.setFechaIngreso(rs.getDate("fechaingresofamilia"));

                    Genero gen = new Genero();
                    gen.setCodigo(rs.getInt("codigogenero"));
                    gen.setNombre(rs.getString("nombregenero"));
                    gen.setFechaIngreso(rs.getDate("fechaingresogenero"));
                    gen.setFamilia(fami);

                    espe.setCodigo(rs.getInt("codigoespecie"));
                    espe.setNombre(rs.getString("nombreespecie"));
                    espe.setFechaIngreso(rs.getDate("fechaingresoespecie"));
                    espe.setGenero(gen);
                }
            }

            rs.close();
            cs.close();
        }
        catch (SQLException e)
        {
            new OrgSistemasDaoException(e.getMessage());
        }

        return espe;
    }

    public int crearEspecie(Especie especie)
    {
        int res = 1;
        return res;
    }

    public int actualizarEspecie(Especie especie)
    {
        int res = 1;
        return res;
    }
}
